<?php
/**
 * 公共类.用户创建,登录,token验证
 * @author JohnnyDen <413819942@qq.com>
 * @package NMClient\Api
 * @copyright 2017年12月12日
 */
namespace NMClient\Api;

use NMClient\Core\Base;

class Common extends Base {
    
    /**
     * 注册登记为管理员
     * @param array $user 帐号数据
     * <code>
     * array(
     *      'id_xpp_user'   => '',  //xpp用户ID
     *      'username'      => '',  //登录帐号
     *      'nickname'      => '',  //昵称
     *      'secret'        => '',  //系统内部使用的登录密码
     * );
     * </code>
     * @return array
     * <code>
     * array(
     *      'status'    => 'ok',
     *      'info'      => '',
     *      'data'      => array(
     *          'uid'           => '', //用户ID
     *          'token'     => array(
     *              'access_token'      => '',  //通信用的用户凭证
     *              'refresh_token'     => '',  //刷新token的凭证
     *              'expire_time'       => '',  //token超时时间
     *          )
     *      )
     * );
     * </code>
     * <b>status值</b>
     * - ok:                    成功
     * - exe_fail:              执行失败
     * 
     * - empty_id_xpp_user:     用户ID不能为空
     * - empty_account:         帐号不能为空
     * - empty_nickname:        昵称不能为空
     * - empty_secret:          密码不能为空
     * - account_exists:        注册失败，登录帐号已存在
     */
    static public function registerFromXPP($account) {
        return self::call(__CLASS__, __FUNCTION__, func_get_args(), null, null, 10);
    }
    
    /**
     * 检测id_xpp_user是否已登记
     * @param int $id_xpp_user xpp用户ID
     * @return array
     * <code>
     * array(
     *      'status'    => 'ok',
     *      'info'      => '',
     *      'data'      => array(
     *          'is_exists'     => 1,   //是否存在，值：1（存在） | 0（不存在）
     *      ),
     * );
     * </code>
     * <b>status值</b>
     * - ok:    成功
     */
    static public function idXppUserExists($id_xpp_user) {
        return self::call(__CLASS__, __FUNCTION__, func_get_args());
    }
    
    /**
        * 检测用户名是否已登记
     * @param string $username 用户名
     * @return array
     * <code>
     * array(
     *      'status'    => 'ok',
     *      'info'      => '',
     *      'data'      => array(
     *          'is_exists'     => 1,   //是否存在，值：1（存在） | 0（不存在）
     *      ),
     * );
     * </code>
     * <b>status值</b>
     * - ok:                    成功
     * - empty_account:         帐号不能为空
     * - error_format_account:  帐号格式错误
     */
    static public function usernameExists($username) {
        return self::call(__CLASS__, __FUNCTION__, func_get_args());
    }
    
    /**
     * 第三方用户登录
     * @param int $id_xpp_user xpp用户ID
     * @param string $uid 千站用户ID
     * @param string $secret 登录密码
     * @return array
     * <code>
     * array(
     *      'status'    => 'ok',
     *      'info'      => '',
     *      'data'      => array(
     *          'uid'   => 101,     //用户ID
     *          'nickname'  => 'JohnnyDen',     //昵称
     *          'account'   => '18107562870',   //登录帐号
     *          'id_main_website'   => 1,
     *          'token'     => array(
     *              'access_token'      => '',  //通信用的用户凭证
     *              'refresh_token'     => '',  //刷新token的凭证
     *              'expire_time'       => '',  //token超时时间
     *          )
     *      )
     * );
     * </code>
     * <b>status值</b>
     * - ok:                    成功
     * - empty_id_xpp_user:     用户ID不能为空
     * - empty_secret:          密码不能为空
     * - null_user:             用户不存在
     * - user_disabled:         用户已被禁用
     * - login_error:           登录失败，帐号或密码错误
     */
    static public function loginBySecret($id_xpp_user, $uid, $secret) {
        return self::call(__CLASS__, __FUNCTION__, func_get_args(), null, null, 10);
    }
    
    /**
     * 管理员登录（动态密码登录）
     * 用于第三方之间发起的表单登录调用的接口
     * @param string $username 登录帐号
     * @param string $dynamic_passwd 动态密码
     * @param string $device_key
     * @return array
     * <code>
     * array(
     *      'status'    => 'ok',
     *      'info'      => '',
     *      'data'      => array(
     *          'uid'   => '',     //用户ID
     *          'nickname'  => 'JohnnyDen',     //昵称
     *          'username'  => '18107562870',   //登录帐号
     *          'login_id_xpp_user' => 1,   //登录的xpp用户ID
     *          'token'     => array(
     *              'access_token'      => '',  //通信用的用户凭证
     *              'refresh_token'     => '',  //刷新token的凭证
     *              'expire_time'       => '',  //token超时时间
     *          )
     *      )
     * );
     * </code>
     * <b>status值</b>
     * - ok:                    成功
     * - empty_account:         帐号不能为空
     * - empty_dynamic_passwd:  动态密码不能为空
     * - user_disabled:         帐号已被禁用
     * - login_error:           登录失败，帐号或密码错误
     */
    static public function loginByDynamicPasswd($username, $dynamic_passwd, $device_key = null) {
        return self::call(__CLASS__, __FUNCTION__, func_get_args(), null, null, 10);
    }
    
    /**
     * 验证token是否有效
     * @param array $token
     * <code>
     * array(
     *      'access_token'      => '',  //通信用的用户凭证
     *      'refresh_token'     => '',  //刷新token的凭证
     *      'expire_time'       => '',  //token超时时间
     * );
     * </code>
     * @return mixed boolean | array
     * - <b>boolean：</b>false(失效，需要重新登录)，true(有效)
     * - <b>array：</b>刷新后的token，需要跟新寄存的旧token
     * <code>
     *      array(
     *          'access_token'      => '',   //通信用的用户凭证
     *          'refresh_token'     => '',   //刷新token的凭证
     *          'expire_time'       => '',   //token超时时间
     *      );
     * </code>
     */
    static public function validateToken( $token ) {
        if (!$token || !$token['access_token'] || !$token['refresh_token']) {
            return false;
        }
        
        if ($token['expire_time'] && $token['expire_time'] - time() <= 30) {
            $result = self::_refreshToken( $token['refresh_token'] );
            if ($result['status'] !== 'ok') {
                return false;
            }
            
            return $result['data'];
        }
        
        return true;
    }
    
    /**
     * 刷新token，access_token超时后，调用此方法重新获得token
     * @param string $refresh_token
     * @return array
     * <code>
     * array(
     *      'status'    => 'ok',
     *      'info'      => '',
     *      'data'      => array(
     *          'access_token'      => '',    //通信用的用户凭证
     *          'refresh_token'     => '',    //刷新token的凭证
     *          'expire_time'       => '',    //token超时时间
     *       )
     * );
     * </code>
     * <b>status的值</b>
     * - ok:    成功
     * - empty_refresh_token:   刷新凭证不能为空
     * - error_refresh_token:   错误的刷新凭证
     * - null_user:             用户不存在
     * - user_disabled:         用户已被禁用
     * - error_refresh_access_token:    更新用户凭证失败
     */
    static private function _refreshToken($refresh_token) {
        return self::call(__CLASS__, __FUNCTION__, func_get_args(), '', 'refreshToken', 10);
    }
}